#pragma once 

#include <iostream>
#include <cassert>
using std::cin;
using std::cout;
using std::endl;
using std::end;

class Date
{
	//友元函数
	friend std::ostream& operator<<(std::ostream& out, const Date& d);
	friend std::istream& operator>>(std::istream& in, Date& d);
public:
	void Print() const
	{
		cout << _year << "-" << _month << "-" << _day << endl;
	}
	//判断是否闰年
	bool isLeapYear(int year)
	{
		return (year % 100 != 0 && year % 4 == 0) || (year % 400 == 0);
	}
	// 获取某年某月的天数
	int GetMonthDay(int year, int month);
	// 全缺省的构造函数
	Date(int year = 1, int month = 1, int day = 1);

	// 拷贝构造函数
	// d2(d1)
	Date(const Date& d)
	{
		_year = d._year;
		_month = d._month;
		_day = d._day;
	}

	// 赋值运算符重载

	// d2 = d3 -> d2.operator=(&d2, d3)
	Date& operator=(const Date& d)
	{
		if (this != &d)//自己赋值自己 不进去
		{
			_year = d._year;
			_month = d._month;
			_day = d._day;
		}
		return *this;
	}

	// 析构函数
	//~Date();日期类不用写析构函数。


	Date& operator+=(int day);
	Date operator+(int day);
	Date operator-(int day);
	Date& operator-=(int day);


	// 前置++
	Date& operator++()
	{
		*this += 1;
		return *this;
	}
	// 后置++
	Date operator++(int)
	{
		Date tmp(*this);
		*this += 1;
		return tmp;
	}
	// 后置--
	Date operator--(int)//加参数为了区分，与传过来的值无关
	{
		Date tmp(*this);
		*this -= 1;
		return tmp;
	}
	// 前置--
	Date& operator--()
	{
		*this -= 1;
		return *this;
	}

	// 日期-日期 返回天数
	int operator-(const Date& d);

	bool operator==(const Date& d);
	bool operator < (const Date& d);

	bool operator>(const Date& d)
	{
		return !(*this <= d);
	}
	bool operator>=(const Date& d)
	{
		return !(*this < d);
	}
	//d1<=d2
	bool operator <= (const Date& d)
	{
		return *this < d || *this == d;
	}
	bool operator != (const Date& d)
	{
		return !(*this == d);
	}

	void Print()
	{
		cout << _year << "-" << _month << "-" << _day << endl;

	}

	/*Date* operator&()
	{
		return this;
	}

	const Date* operator&() const
	{
		return this;
	}*/

	//void operator<<(std::ostream& out)
	//{

	//}

	//void operator>>(std::ostream& in)
	//{

	//}


private:
	int _year;
	int _month;
	int _day;
};
